package com.example.blogsystem.controller;

import com.example.blogsystem.common.AppVar;
import com.example.blogsystem.common.PasswordUtils;
import com.example.blogsystem.common.ResultAjax;
import com.example.blogsystem.model.Userinfo;
import com.example.blogsystem.model.vo.UserinfoVO;
import com.example.blogsystem.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Created with IntelliJ IDEA.
 * Description: 用户控制器
 * User: DELL
 * Date: 2023-09-03
 * Time: 23:02
 */

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 注册功能
     *
     * @param userinfo
     * @return
     */
    @RequestMapping("/reg")
    public ResultAjax reg(Userinfo userinfo) {
        // 1. 校验参数(非空校验+不能以空格开头)
        if (userinfo == null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())) {
            return ResultAjax.fail(-1, "非法参数");
        }
        if (userinfo.getUsername().charAt(0) == ' ' || userinfo.getPassword().charAt(0) == ' ') {
            return ResultAjax.fail(-1, "非法参数");
        }
        // 2. 检验用户名是否已存在
        if (userService.getUserByName(userinfo.getUsername()) != null) {
            return ResultAjax.fail(-1, "用户名已存在");
        }
        // 3. 请求service进行添加操作
        // 将注册用户的密码进行加盐加密
        String finalPassword = PasswordUtils.encrypt(userinfo.getPassword());
        userinfo.setPassword(finalPassword);
        int result = userService.reg(userinfo);
        // 4. 将得到的结果返回给前端
        return ResultAjax.success(result);
    }


    /**
     * 登录功能
     *
     * @return
     */
    @RequestMapping("/login")
    public ResultAjax login(UserinfoVO userinfoVO, HttpServletRequest request) {
        // 1.参数校验(非空校验+不能以空格开头)
        if (userinfoVO == null || !StringUtils.hasLength(userinfoVO.getUsername())
                || !StringUtils.hasLength(userinfoVO.getPassword())) {
            return ResultAjax.fail(-1, "非法参数");
        }
        if (userinfoVO.getUsername().charAt(0) == ' ' || userinfoVO.getPassword().charAt(0) == ' ') {
            return ResultAjax.fail(-1, "非法参数");
        }
        // 2.根据用户输入的用户名查询用户
        Userinfo userinfo = userService.getUserByName(userinfoVO.getUsername());
        if (userinfo == null) {
            return ResultAjax.fail(-2, "用户名或密码错误!");
        }
        // 3.将查询到的密码和用户输入的密码进行比对
        // 这里因为数据库中密码使用的是加盐加密,因此
        // 这里需要对用户输入的密码进行加盐加密后和正确密码比对
        if (!PasswordUtils.decrypt(userinfoVO.getPassword(), userinfo.getPassword())) {
            return ResultAjax.fail(-2, "用户名或密码错误!");
        }
        // 4.比较成功后,将对象存入 session 中
        HttpSession session = request.getSession();
        session.setAttribute(AppVar.USER_SESSION_KEY, userinfo);
        // 5.将结果返回给用户
        return ResultAjax.success(1);
    }

    /**
     * 注销功能
     *
     * @return
     */
    @RequestMapping("/logout")
    public ResultAjax logout(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null || session.getAttribute(AppVar.USER_SESSION_KEY) != null) {
            session.removeAttribute(AppVar.USER_SESSION_KEY);
        }
        return ResultAjax.success(1);
    }
}
